package com.bjpowernode.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {
    @Bean   //spring security的密码加密器，用于比较密码
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    //配置spring security框架的一些行为(配置我们自己的登录页，不适用框架默认的登录页)
    //但是当配置了SecurityFilterChain这个Bean之后，security框架的某些默认行为就失效了
    @Bean   //安全过滤器链Bean        自动注入HttpSecurity
    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                //配置我们自己的登录页
                .formLogin(fl -> {
                    //security框架默认接收登录提交请求的地址是/login，也就是表单提交的地址，
                    //但是我们自定义配置之后，这些默认行为失效了，所以下面loginProcessingUrl
                    //把它给加了回来。就是登录账号和密码往那个地址提交
                    fl.loginProcessingUrl("/login")
                            .loginPage("/toLogin");
                })
                //把拦截所有接口请求进行登录状态检查的默认行为加回来
                .authorizeHttpRequests(auth -> {
                    //requestMatchers("/toLogin").permitAll()是特殊情况的设置，
                    //因为下面的表示所有请求都要拦截认证，而这个表示toLogin不用认证直接放行
                    auth.requestMatchers("/toLogin").permitAll()
                            //anyRequest().authenticated()表示任何对后端接口的请求，
                            //都需要登录认证后才能访问
                            .anyRequest().authenticated();
                })
                .build();
    }
}
